%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% File:               Params3.m
%
% Authors:            Sergio Ascencio and Miguel Rueda
%
% Description:        Maximizes log likelihood of 2 step ML estimator (3
% Players)
%
% Language:           MATLAB R2013b (8.2.0.701) 64 Bit
%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%


function [beta,LL,hessian,auxLL,Llong]=Params3(Y,X,phats,beta_p)


%Extended
% varsx={'l_d_RC_others' 'l_margin' 'lcasillas' 'school_ic' 'l_diff_PRI_PAN' 'l_diff_PRI_PRD' 'l_diff_PAN_PRD' 'lpop' 'l_turnout' 'local' 'ldist_city' ...
% 'l_d_RC_others_sq' 'l_margin_sq' 'lcasillas_sq' 'school_ic_sq' 'l_diff_PRI_PAN_sq' 'l_diff_PRI_PRD_sq' 'l_diff_PAN_PRD_sq' 'lpop_sq' 'l_turnout_sq' 'ldist_city_sq' ...
% 'l_d_RC_others_l_margin' 'l_d_RC_others_lcasillas' 'l_d_RC_others_school_ic' 'l_d_RC_others_l_diff_PRI_PAN' 'l_d_RC_others_l_diff_PRI_PRD' 'l_d_RC_others_l_diff_PAN_PRD' 'l_d_RC_others_lpop' 'l_d_RC_others_l_turnout' 'l_d_RC_others_local' 'l_d_RC_others_ldist_city' ...
% 'l_margin_lcasillas' 'l_margin_school_ic' 'l_margin_l_diff_PRI_PAN' 'l_margin_l_diff_PRI_PRD' 'l_margin_l_diff_PAN_PRD' 'l_margin_lpop' 'l_margin_l_turnout' 'l_margin_local' 'l_margin_ldist_city' ...
% 'lcasillas_school_ic' 'lcasillas_l_diff_PRI_PAN' 'lcasillas_l_diff_PRI_PRD' 'lcasillas_l_diff_PAN_PRD' 'lcasillas_lpop' 'lcasillas_l_turnout' 'lcasillas_local' 'lcasillas_ldist_city' ...
% 'school_ic_l_diff_PRI_PAN' 'school_ic_l_diff_PRI_PRD' 'school_ic_l_diff_PAN_PRD' 'school_ic_lpop' 'school_ic_l_turnout' 'school_ic_local' 'school_ic_ldist_city' ...
% 'l_diff_PRI_PAN_lpop' 'l_diff_PRI_PAN_l_turnout' 'l_diff_PRI_PAN_local' 'l_diff_PRI_PAN_ldist_city' 'l_diff_PRI_PRD_lpop' 'l_diff_PRI_PRD_l_turnout' 'l_diff_PRI_PRD_local' 'l_diff_PRI_PRD_ldist_city' ...
% 'l_diff_PAN_PRD_lpop' 'l_diff_PAN_PRD_l_turnout' 'l_diff_PAN_PRD_local' 'l_diff_PAN_PRD_ldist_city' ...
% 'lpop_l_turnout' 'lpop_local' 'lpop_ldist_city' ...
% 'l_turnout_local' 'l_turnout_ldist_city' ...
% 'local_ldist_city' 'ldist_pri' 'gov_PRI' 'ldist_pan' 'gov_PAN' 'ldist_prd' 'gov_PRD'};



%Remember 1: prob H in first, M in second column
%Remember 2: change code below when changing X specification

p_PRI=phats{1,1}(:,1:2); 
p_PAN=phats{1,2}(:,1:2);
p_PRD=phats{1,3}(:,1:2);

Z_PRD=X(:,end-1:end);
Z_PAN=X(:,end-3:end-2);
Z_PRI=X(:,end-5:end-4);

X=X(:,1:11);

Y_PRD=Y(:,3);
Y_PAN=Y(:,2);
Y_PRI=Y(:,1);

y_PRD=dummyvar(Y_PRD+1);
y_PAN=dummyvar(Y_PAN+1);
y_PRI=dummyvar(Y_PRI+1);

X_PRI=[X Z_PRI p_PAN p_PRD ones(size(X,1),1)];
X_PAN=[X Z_PAN p_PRI p_PRD ones(size(X,1),1)];
X_PRD=[X Z_PRD p_PRI p_PAN ones(size(X,1),1)];

if nargin<4
    beta_p_PRD=(X_PRD'*X_PRD)\(X_PRD'*y_PRD(:,2:3));
    beta_p_PAN=(X_PAN'*X_PAN)\(X_PAN'*y_PAN(:,2:3));
    beta_p_PRI=(X_PRI'*X_PRI)\(X_PRI'*y_PRI(:,2:3));  
    beta_p=[beta_p_PRI beta_p_PAN beta_p_PRD];
end   

options = optimset('GradObj','on','Display','iter-detailed','MaxFunEvals',20000,'TolX',1e-08,'TolFun',1e-11,'DerivativeCheck','off','Hessian','on','MaxIter',700);

        tic;
                    [beta,LL,~,~,~,hessian] = fminunc(@(b)log_likelihood3(b,Y_PRI,Y_PAN,Y_PRD,X_PRI,X_PAN,X_PRD),beta_p(:),options);
        toc;

[auxLL,Llong]=aux_log_likelihood3(beta,Y_PRI,Y_PAN,Y_PRD,X_PRI,X_PAN,X_PRD);
end

